﻿using System.Data;
using 战斗系统原型.数值处理.战斗;

namespace 战斗系统原型
{
    public enum 攻击属性
    {
        未定义, 风, 电, 地, 光, 物理
    }

    public enum Buff增强类型
    {
        全体生命,
        全体符力,
        全体怒气,
        全体攻击力,
        全体物理攻击能力,
        全体符卡攻击能力,
        全体爆击率,
        全体防御力,

    }

    public enum 技能类型
    {
        符卡,
        技能,
        御守,
    }

    public enum 物品类型
    {
        食品恢复品,
        药品恢复品,
        战斗辅助品,
        任务物品,
        灵梦御守
    }

    public enum 作用对象
    {
        我方单体,
        我方全体,
        我方随机,
        敌方单体,
        敌方全体,
        敌方随机,
    }
    public enum 作用数值
    {
        等级,
        事件,
        生命值上限,
        符力值上限,
        怒气值上限,
        生命值,
        符力值,
        怒气值,
        爆击率,
        物防力,
        符防力,
        基础物攻,
        基础符攻,
        经验值上限,
        角色属性,
        物品全体化,
        技能全体化,
        御守全体化,
        流血状态,
        灼烧状态,
        麻痹状态,
        平摊生命与符力,

    }
    public enum 操作类型
    {
        增加,
        减少,
        获得,
        驱散
    }

    public enum 队伍类型
    {
        我方队伍,
        敌方队伍,
        无队伍
    }

    public enum 战斗选项
    {
        战斗,
        符卡与符术,
        御守,
        物品,
        防御,
        逃跑,
        神明,
        决意
    }

    public enum AI模式
    {
        随意攻击,
        攻击血量最低角色,
        攻击防御最低角色,
        攻击血量与防御之和最低角色,
        力图造成最高伤害,
        优先驱散玩家状态,
        优先驱散自身状态,
        优先自身附加状态,
        优先全体伤害,
    }

    public struct 效果
    {
        public 效果()
        {

        }
        public 作用对象 作用对象 { get; set; } = 作用对象.我方单体;
        public 作用数值 作用数值 { get; set; } = 作用数值.生命值;
        public 操作类型 操作类型 { get; set; } = 操作类型.减少;
        public int 持续回合 { get; set; } = 0;
        public int 操作数值 { get; set; } = 0;
        public bool 操作开关 { get; set; } = false;
    }

    public class 战场属性
    {
        public float 决意值 { get; set; }
        public float 决意值上限 { get; set; } = 100;
        public float 击破值 { get; set; }
        public float 击破值上限 { get; set; } = 100;
        public float 回合数 { get; set; } = 1;
        public List<List<角色>> 行动条 = new List<List<角色>>(3);
        public Dictionary<队伍类型, 队伍>? 队伍数据;
        public List<string> 日志 = new List<string>();
        public DateTime 启动战斗时间 = DateTime.Now;
        public Action<战场属性, Dictionary<队伍类型, 队伍>>? 下一行动;
        public Action<战场属性, Dictionary<队伍类型, 队伍>>? 重新计算行动;
        public 角色 当前行动角色 { get; set; } = new();
        public 队伍类型 获胜队伍 { get; set; } = 队伍类型.无队伍;
    }

    public class 队伍
    {
        public string 队伍名称 { get; set; } = "未命名队伍";
        public List<角色> 队伍成员 { get; set; } = new();
        public int 队伍金钱 { get; set; }
        public int 队伍经验值 { get; set; }
        public List<物品> 物品列表 { get; set; } = new List<物品>();
    }

    public class 数据组
    {
        public Dictionary<string, 角色> 人物数据 = new Dictionary<string, 角色>();
        public Dictionary<string, 角色> 敌人数据 = new Dictionary<string, 角色>();
        public Dictionary<string, 物品> 物品数据 = new Dictionary<string, 物品>();
        public Dictionary<string, 技能> 技能数据 = new Dictionary<string, 技能>();
        public static Dictionary<string, DataTable> 角色数值表 = new Dictionary<string, DataTable>();
        public Dictionary<队伍类型, 队伍> 队伍数据 = new Dictionary<队伍类型, 队伍>();
        public 战场属性 战场数据 = new 战场属性();

    }


    public class 角色
    {

        public enum 操作者
        {
            玩家,
            AI
        }
        public enum 状态
        {
            濒死,
            正常,
            消失
        }

        public string 角色名称 { set; get; } = "未定义";
        public 攻击属性 角色属性 { get; set; } = 攻击属性.未定义;
        public 状态 角色状态 { get; set; } = 状态.正常;
        public float 等级 { get; set; }
        public float 生命值 { get; set; }
        public float 符力值 { get; set; }
        public float 怒气值 { get; set; }
        public float 生命值上限 { get; set; }
        public float 符力值上限 { get; set; }
        public float 怒气值上限 { get; set; }
        public float 生命值上限附加 { get; set; }
        public float 符力值上限附加 { get; set; }
        public float 爆击率 { get; set; }
        public float 物防力 { get; set; }
        public float 符防力 { get; set; }
        public float 基础物攻 { get; set; }
        public float 爆击率附加 { get; set; }
        public float 物防力附加 { get; set; }
        public float 符防力附加 { get; set; }
        public float 基础物攻附加 { get; set; }
        public float 物攻最低 { get; set; }
        public float 物攻最高 { get; set; }
        public float 基础符攻 { get; set; }
        public float 基础符攻附加 { get; set; }
        public float 符攻最低 { get; set; }
        public float 符攻最高 { get; set; }
        public float 速度 { get; set; }
        public float 速度附加 { get; set; }
        public List<int> 技能ID { get; set; } = new List<int>();
        public float 经验值上限 { get; set; }
        public bool 技能全体化 { get; set; }
        public bool 物品全体化 { get; set; }
        public bool 御守全体化 { get; set; }
        public bool 流血 { get; set; }
        public bool 灼烧 { get; set; }
        public bool 麻痹 { get; set; }
        public bool 破除上限 { get; set; }
        public List<物品> 掉落物品 { get; set; } = new();
        public float 掉落物品概率 { get; set; }
        public int 掉落金钱 { get; set; }
        public int 掉落经验值 { get; set; }
        public 操作者 操作模式 { get; set; }
        public 战斗系统.战斗选项卡.选项组 注册战斗选项 { get; set; } = new();
        public Action<角色, 角色, 战场属性> 物理攻击 { get; set; } = 默认数值计算.物理攻击;
        public Action<角色, 角色, 技能, 战场属性> 技能攻击 { get; set; } = null;
        public Action<角色, 角色, 技能, 战场属性> 被技能攻击 { get; set; } = null;
        public Action<角色, 物品, 战场属性> 恢复 { get; set; } = null;
        public Action<角色, 角色, 战场属性, 攻击属性, float> 被物理攻击 { get; set; } = 默认数值计算.被物理攻击;
        public Action<角色, 战场属性> 检测角色死亡 { get; set; } = 默认数值计算.检测角色死亡;
        public void 还原默认攻击计算()
        {
            物理攻击 = 默认数值计算.物理攻击;
            被物理攻击 = 默认数值计算.被物理攻击;
            检测角色死亡 = 默认数值计算.检测角色死亡;
        }
    }

    public class 武器
    {
        public string 名称 { get; set; } = "默认武器";
        public float 最大攻击力 { get; set; }
        public float 最小攻击力 { get; set; }
        public 攻击属性 属性 { get; set; }
    }

    public class 防具
    {
        public string 名称 { get; set; } = "默认防具";
        public float 最大防御力 { get; set; }
        public float 最小防御力 { get; set; }
    }

    public class 技能
    {
        public int ID { get; set; }
        public string 技能名称 { get; set; } = "未设定名称";
        public 角色 兼容人物 { get; set; } = new 角色();
        public bool 对所有敌人兼容 { get; set; } = false;
        public 技能类型 技能类型 { get; set; } = 技能类型.技能;
        public 作用对象 作用对象 { get; set; }
        public 攻击属性 伤害属性 { get; set; }
        public int 伤害次数 { get; set; }
        public float 物攻加成 { get; set; }
        public float 符攻加成 { get; set; }
        public float 额外固定值 { get; set; }
        public List<效果> 效果列 { get; set; } = new();
        public List<效果> 计数消耗 { get; set; } = new();
        public string 物品栏概述 { get; set; } = "未设定";
        public string 战斗时概述 { get; set; } = "未设定";
    }
 
    public class 物品
    {
        public int ID { get; set; } = -1;
        public string 名称 { get; set; } = "未设定";
        public 物品类型 类型 { get; set; } = 物品类型.任务物品;
        public List<效果> 效果列 { get; set; } = new List<效果>();
        public int 计数消耗 { get; set; }
        public int 所需金钱 { get; set; }
        public string 获得方式 { get; set; } = "未设定";
        public string 物品栏概述 { get; set; } = "未设定";
        public string 战斗时概述 { get; set; } = "未设定";
    }

    public class 队伍Buff
    {
        public string Buff名称 { get; set; } = "默认Buff";
        public Buff增强类型 增强类型 { get; set; }
    }

}
